#ifndef INTERPOLATIONENGINE_H
#define INTERPOLATIONENGINE_H

#include <QObject>
#include <QPointF>
#include <QDateTime>
#include <QTimer>
#include <QMutex>
#include <QHash>
#include <QColor>

/**
 * @brief 插值渲染引擎
 * 
 * 根据Qt6_Client_Development_Guide.md实现的高性能插值渲染引擎
 * 提供平滑的游戏对象移动和动画效果
 */
class InterpolationEngine : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 插值位置结构
     */
    struct InterpolatedPosition {
        float x, y;                 ///< 插值后的位置
        float rotation;             ///< 旋转角度
        float scale;                ///< 缩放比例
        float alpha;                ///< 透明度
        
        InterpolatedPosition() : x(0), y(0), rotation(0), scale(1.0f), alpha(1.0f) {}
        InterpolatedPosition(float x, float y) : x(x), y(y), rotation(0), scale(1.0f), alpha(1.0f) {}
    };

    /**
     * @brief 蛇数据结构（简化版）
     */
    struct SnakeData {
        QString playerId;
        QList<QPointF> body;
        int direction;
        QColor color;
        qint64 lastMoveTime;
        bool alive;
    };

    /**
     * @brief 食物数据结构（简化版）
     */
    struct FoodData {
        QPointF position;
        int type;
        QColor color;
        qint64 spawnTime;
        float scale;
        float rotation;
    };

    explicit InterpolationEngine(QObject *parent = nullptr);

    // === 核心插值方法 ===
    
    /**
     * @brief 计算蛇的插值位置
     * @param current 当前蛇状态
     * @param previous 上一帧蛇状态
     * @param factor 插值因子 (0.0-1.0)
     * @return 插值后的位置信息
     */
    InterpolatedPosition interpolateSnakePosition(
        const SnakeData& current,
        const SnakeData& previous,
        float factor
    );

    /**
     * @brief 插值蛇身体各段
     * @param current 当前蛇状态
     * @param previous 上一帧蛇状态
     * @param factor 插值因子
     * @return 插值后的身体位置列表
     */
    QList<InterpolatedPosition> interpolateSnakeBody(
        const SnakeData& current,
        const SnakeData& previous,
        float factor
    );

    /**
     * @brief 计算食物的插值位置
     * @param current 当前食物状态
     * @param previous 上一帧食物状态
     * @param factor 插值因子
     * @return 插值后的位置信息
     */
    InterpolatedPosition interpolateFoodPosition(
        const FoodData& current,
        const FoodData& previous,
        float factor
    );

    /**
     * @brief 预测下一帧位置
     * @param snake 蛇数据
     * @param deltaMs 时间差（毫秒）
     * @return 预测的位置
     */
    QPointF predictNextPosition(const SnakeData& snake, int deltaMs);

    /**
     * @brief 计算插值因子
     * @param currentTime 当前时间
     * @param lastUpdateTime 上次更新时间
     * @param serverTickInterval 服务器tick间隔（毫秒）
     * @return 插值因子 (0.0-1.0)
     */
    float calculateInterpolationFactor(
        qint64 currentTime,
        qint64 lastUpdateTime,
        int serverTickInterval
    );

    // === 配置方法 ===
    
    /**
     * @brief 设置服务器tick间隔
     * @param intervalMs 间隔（毫秒）
     */
    void setServerTickInterval(int intervalMs) { m_serverTickInterval = intervalMs; }

    /**
     * @brief 启用/禁用平滑移动
     * @param enabled 是否启用
     */
    void setSmoothMovementEnabled(bool enabled) { m_smoothMovementEnabled = enabled; }

    /**
     * @brief 设置插值强度
     * @param strength 强度 (0.0-1.0)
     */
    void setInterpolationStrength(float strength) { m_interpolationStrength = qBound(0.0f, strength, 1.0f); }

    // === 状态管理 ===
    
    /**
     * @brief 更新游戏状态
     * @param snakes 蛇列表
     * @param foods 食物列表
     * @param timestamp 时间戳
     */
    void updateGameState(
        const QList<SnakeData>& snakes,
        const QList<FoodData>& foods,
        qint64 timestamp
    );

    /**
     * @brief 重置插值引擎
     */
    void reset();

private:
    // === 插值算法 ===
    
    /**
     * @brief 线性插值
     */
    float lerp(float a, float b, float t);
    
    /**
     * @brief 平滑插值（使用缓动函数）
     */
    float smoothLerp(float a, float b, float t);
    
    /**
     * @brief 角度插值（处理角度环绕）
     */
    float interpolateAngle(float from, float to, float t);
    
    /**
     * @brief 位置插值
     */
    QPointF interpolatePosition(const QPointF& from, const QPointF& to, float t);

    // === 成员变量 ===
    
    int m_serverTickInterval;           ///< 服务器tick间隔（毫秒）
    bool m_smoothMovementEnabled;       ///< 是否启用平滑移动
    float m_interpolationStrength;      ///< 插值强度
    
    // 状态缓存
    QList<SnakeData> m_currentSnakes;   ///< 当前蛇状态
    QList<SnakeData> m_previousSnakes;  ///< 上一帧蛇状态
    QList<FoodData> m_currentFoods;     ///< 当前食物状态
    QList<FoodData> m_previousFoods;    ///< 上一帧食物状态
    
    qint64 m_lastUpdateTime;            ///< 上次更新时间
    qint64 m_currentTime;               ///< 当前时间
    
    QMutex m_stateMutex;                ///< 状态保护锁

signals:
    /**
     * @brief 插值状态更新信号
     */
    void interpolationUpdated();
};

#endif // INTERPOLATIONENGINE_H
